<?php
if(!defined('IMAGEN_MUY_ANCHA_O_ALTA')){
    require_once RAIZ . '/codigos_error.php';
}
// Esta class maneja las imagenes, es necesaria para impedir el hotlinking (el usuario debe estar logueado en el juego para poder ver la imagen) // no se usa con las imágenes de raza
class Imagen{
    var $ID,$ImagenFisica,$Creador,$Error;
    var $TamanoMaximo,$AnchoMaximo,$AltoMaximo;
    var $Ancho,$Alto,$Mime,$UbicacionTemporal;
    private $ImagenValida,$Permisos,$ImagenYaMovida;
    function Imagen($TamanoMaximo,$AnchoMaximo,$AltoMaximo){
        $this->ID = 0;
        $this->TamanoMaximo = $TamanoMaximo;
        $this->AnchoMaximo = $AnchoMaximo;
        $this->AltoMaximo = $AltoMaximo;
        $this->Error = -1; // Sin usar de momento
        $this->ImagenValida = true;
        $this->Permisos = 777;
        $this->Creador = 0; // Si la imagen pertenece de manera concreta a un jugador, 0 es el juego
        $this->ImagenYaMovida = false;
    }
    // En este caso no hace falta hacer intvals... estamos cargando directamente desde SQL
    private function cargar($ArrayEntrada){
        $this->ID = @$ArrayEntrada['id'];
        $this->ImagenFisica = @$ArrayEntrada['ImagenFisica'];
        $this->Creador = @$ArrayEntrada['Creador'];
        $this->Permisos = @$ArrayEntrada['Permisos'];
        $this->Mime = @$ArrayEntrada['Mime'];
    }
    function cargarImagenById($idImagen){
        $idImagen = intval($idImagen);
        $GLOBALS['ObjetoConexion']->consulta("SELECT * FROM `imagenes` WHERE `id`='$idImagen' LIMIT 1");
        $this->cargar($GLOBALS['ObjetoConexion']->fetchArray());
    }
    // POST Procesar Imagen en $_FILES
    function procesarImagen($FicheroImagen){
        if(!isset($FicheroImagen) || $FicheroImagen['error'] == 4) return;
        $Dimensiones = @getimagesize($FicheroImagen['tmp_name']);
        $Respuesta = array();
        if(!is_array($Dimensiones) || (@count($GLOBALS['FormatosSoportadosImagenes']) > 0 && !@in_array($Dimensiones['mime'],$GLOBALS['FormatosSoportadosImagenes']))){
            $Respuesta['NumError'] = IMAGEN_NO_VALIDA;
            $Respuesta['Mime'] = &$FicheroImagen['type'];
            $Respuesta['FormatosSoportados'] = &$GLOBALS['FormatosSoportadosImagenes'];
            die(json_encode($Respuesta));
        }
        if($FicheroImagen['size'] > $this->TamanoMaximo){
            $Respuesta['NumError'] = IMAGEN_MUY_GRANDE;
            $Respuesta['Tamano'] = &$FicheroImagen['size'];
            $Respuesta['TamanoMaximo'] = &$this->TamanoMaximo;
            die(json_encode($Respuesta));
        }
        if($Dimensiones[0] > $this->AnchoMaximo || $Dimensiones[1] > $this->AltoMaximo){
            $Respuesta['NumError'] = IMAGEN_MUY_ANCHA_O_ALTA;
            $Respuesta['AnchoOriginal'] = &$Dimensiones[0];
            $Respuesta['AltoOriginal'] = &$Dimensiones[1];
            $Respuesta['AnchoMaximo'] = &$this->AnchoMaximo;
            $Respuesta['AltoMaximo'] = &$this->AltoMaximo;
            die(json_encode($Respuesta));
        }
        $this->UbicacionTemporal = $FicheroImagen['tmp_name'];
        $this->Mime = $FicheroImagen['type'];
        $this->Error = 0; // Sin usar de momento
        $this->ImagenYaMovida = false;
        $this->ImagenValida = true;
    }
    // Muve la imagen al directorio correcto
    private function moverImagen(){
        if(!$this->ImagenValida) return false;
        if(!file_exists(DIR_IMAGENES)) throw new Exception('El directorio de imágenes ' . DIR_IMAGENES . ' no existe',SERVFAULT);
        if(!is_dir(DIR_IMAGENES)) throw new Exception(DIR_IMAGENES . " NO es un directorio",SERVFAULT);
        if(!is_readable(DIR_IMAGENES)) throw new Exception('FATAL: El directorio ' . DIR_IMAGENES . ' no se puede leer',SERVFAULT);
        if(!is_writable(DIR_IMAGENES)) throw new Exception('FATAL: El directorio ' . DIR_IMAGENES . ' no se puede escribir',SERVFAULT);
        for($i=1;file_exists(DIR_IMAGENES . $i . '.img');$i++){ }
        if(!move_uploaded_file($this->UbicacionTemporal,DIR_IMAGENES . $i . '.img')){
            throw new Exception('Ocurrió un error extraño al trata de mover el archivo',SERVFAULT);
        }
        $this->ImagenYaMovida = true;
        $this->ImagenFisica = $i . '.img';
    }
    // Inserta la imagen en la base de datos devuelve false si no se ha podido realizar y el id en caso de éxito
    function insertar(){
        if(!$this->ImagenValida || $this->Error != 0) return false;
        if(!$this->ImagenYaMovida) $this->moverImagen();
        if($this->ID == 0){
            $GLOBALS['ObjetoConexion']->consulta("INSERT INTO `imagenes` (`ImagenFisica`,`Creador`,`Permisos`,`Mime`)VALUES('$this->ImagenFisica','$this->Creador','$this->Permisos','$this->Mime');");
            $this->ID =  $GLOBALS['ObjetoConexion']->insert_id;
        }else{
            $GLOBALS['ObjetoConexion']->consulta("UPDATE `imagenes` SET `ImagenFisica`='$this->ImagenFisica',`Creador`='$this->Creador',`Permisos`='$this->Permisos' WHERE `id`='$this->ID' LIMIT 1");
        }
        /* Require reimplementación con try_catch cuando se me ocurra la idea
        if($GLOBALS['ObjetoConexion']->error){
            $this->borrar();
            throw Exception('Error SQL al insertar la imagen',SERVFAULT);
            
        }
        */
        return $this->ID;
    }
    // Imprime la imagen en raw, aviso esto reemplaza el Content-Type por el que tenga la imagen
    function printImagenRAW(){
        header('Content-Type:' . $this->Mime,1);
        readfile(DIR_IMAGENES . $this->ImagenFisica);
    }
    // Borra la imagen fisicamente
    function borrar(){
        unlink(DIR_IMAGENES . $this->ImagenFisica);
    }
}
?>